package cn.dwy2002.binaryhandwritingserver.controller;

import cn.dwy2002.binaryhandwritingserver.common.Result;
import cn.dwy2002.binaryhandwritingserver.exception.TagNotFoundException;
import cn.dwy2002.binaryhandwritingserver.pojo.po.Tags;
import cn.dwy2002.binaryhandwritingserver.pojo.vo.TagsVO;
import cn.dwy2002.binaryhandwritingserver.service.service.TagService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 标签管理
 *
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/05/31
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/tags")
public class TagController {
    private final TagService tagService;

    /**
     * 创建新标签
     *
     * @param tag 标签数据
     * @return 创建结果
     */
    @PostMapping
    public Result<Void> createTag(@RequestBody Tags tag) {
        return tagService.createTag(tag);
    }

    /**
     * 更新标签信息
     *
     * @param tag 标签数据
     * @return 更新结果
     * @throws TagNotFoundException 标签不存在时抛出
     */
    @PutMapping
    public Result<Void> updateTag(@RequestBody Tags tag) throws TagNotFoundException {
        return tagService.updateTag(tag);
    }

    /**
     * 删除标签
     *
     * @param id 标签ID
     * @return 删除结果
     * @throws TagNotFoundException 标签不存在时抛出
     */
    @DeleteMapping("/{id}")
    public Result<Void> deleteTag(@PathVariable Long id) throws TagNotFoundException {
        return tagService.deleteTag(id);
    }

    /**
     * 获取标签详情
     *
     * @param id 标签ID
     * @return 标签详情
     * @throws TagNotFoundException 标签不存在时抛出
     */
    @GetMapping("/{id}")
    public Result<TagsVO> getTagById(@PathVariable Long id) throws TagNotFoundException {
        return tagService.getTagById(id);
    }

    /**
     * 获取所有标签
     *
     * @return 标签列表
     */
    @GetMapping
    public List<TagsVO> getAllTags() {
        return tagService.getAllTags();
    }

    /**
     * 根据名称获取标签
     *
     * @param name 标签名称
     * @return 标签详情
     */
    @GetMapping("/by-name")
    public Result<TagsVO> getTagByName(@RequestParam String name) {
        return tagService.getTagByName(name);
    }
}
